package 网络编程.udpEchoServerCilent;
import java.io.IOException;
import java.net.*;

// 服务器
public class UdpEchoServer {
    private DatagramSocket socket = null;  // 创建 DatagramSocket 对象就相当于在内核中打开了一个 Socket 文件, 就可以开始传输数据

    // 服务器一般会指定端口
    public UdpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    // 服务器开始工作 |  接收请求, 发出响应
    public void start() throws IOException {
        while (true) {
            // 1. 接收请求 数据
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096); // 参数为一个空的缓冲区, 并指定大小
            socket.receive(requestPacket); // 参数为空的 DatagramPacket, 读取到的数据都会放在参数中
            // 2. 解析数据, 将数据转化成字符串
            String request = new String(requestPacket.getData(), 0, requestPacket.getLength());
            String response = process(request); // 对请求进行加工, 加工成响应
            // 3. 对响应进行包装, 发给客户端
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), response.getBytes().length,
                    requestPacket.getSocketAddress()); // 再发回给客户端
            socket.send(responsePacket);  // 发送
            System.out.printf("[%s  |  %d]\nrequest -> %s  |  response -> %s",
                    requestPacket.getAddress().toString(), requestPacket.getPort(), request, response);
        }
    }

    // 这里可以对 "请求"的字符串进行加工, 返回响应, 这里是回显服务器, 不加工
    private String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer server = new UdpEchoServer(6666); // 指定端口号为6666
        server.start();
    }
}
